package com.sl.au.service;

import java.util.List;
import java.util.Map;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;

import com.sl.au.entity.AuditNode;
import com.sl.au.entity.CustomProcess;
import com.sl.au.entity.MyTask;
import com.sl.au.entity.User;

public interface ActivitiService extends BaseService
{
    /**
     * 通过流程名称(文件夹名称)返回所有资源文件
     * 
     * @param processName
     * @return
     */
    List<String> getProcessSoureceFiles(String processName);
    
    /**
     * 将一个流程所需要的文件传入，并部署
     * 
     * @param fileList
     * @return
     */
    Deployment deploy(List<String> fileList);
    
    /**
     * 将指定目录下所有的文件部署为一个流程定义
     * 
     * @param processDirName
     * @return
     */
    Deployment deployByProcessDirName(String processDirName);
    
    /**
     * 将指定ID的流程部署
     * 
     * @param processDefinitionKey
     * @return
     */
    String checkDeployByProcessDefinitionKey(String processDefinitionKey);
    
    /**
     * 删除一个工作流发布，包括历史记录
     * 
     * @param deploymentId
     */
    void deleteDeployment(String deploymentId);
    
    /**
     * 得到某个用户发起正运行中流程的定制信息
     * 
     * @param userId
     * @return
     */
    List<CustomProcess> getRunningProcessByUser(String userId);
    
    /**
     * 得到某个用户发起已完成流程的定制信息
     * 
     * @param userId
     * @return
     */
    List<CustomProcess> getCompletedProcessByUser(String userId);
    
    /**
     * 撤销指定流程实例
     * 
     * @param processInstanceId
     */
    void cancelProcessInstance(String processInstanceId);
    
    /**
     * 发起流程程序
     * 
     * @param processDefinitionId
     * @param userId
     * @param formData
     * @return
     */
    ProcessInstance startProcessInstance(String processDefinitionId,
                                         String userId,
                                         Map<String, String> formData);
    /**
     * 
     * @param processDefinitionId
     * @param userId
     * @param formData
     * @return
     */
   /* ProcessInstance cStartProcessInstance(String processDefinitionId,
            String userId,
            Map<String, Object> dateMap);*/
    /**
     * 返回用户任务
     * 
     * @param userId
     * @return
     */
    List<Task> getTasksByUser(String userId);
    
 
    /**
     * 通过任务得到流程变量
     * 
     * @param taskId
     * @return
     */
    Map<String, Object> getVariablesByTaskId(String taskId);
    
    /**
     * 返回用户任务定制列表
     * 
     * @param userId
     * @return
     */
    List<MyTask> getMyTasksByUser(String userId);
    
    /**
     * 通过任务得到对应表单
     * 
     * @param taskId
     * @return
     */
    Object getTaskForm(String taskId);
    
    /**
     * 提交表单数据完成任务
     * 
     * @param taskId
     * @param formData
     * @param auditNode
     */
    void submitTaskFormData(String taskId, Map<String, String> formData,AuditNode auditNode);
    
    /**
     * @param taskId
     * @return 指定任务相关的流程实例是否完成
     */
    Boolean isProcessInstanceFinished(String taskId);
    
    /**
     * 得到流程图的文件流
     * 
     * @param list
     * @return
     */
    // InputStream getProcessDefinitionDiagram(String processDefinitionId);
    
    /**
     * 从历史记录中提取到定制流程信息
     * 
     * @param list
     * @return
     */
    List<CustomProcess> history2CustomProcess(List<HistoricProcessInstance> list);
    
    /**
     * 得到到系统用户信息
     * 
     * @param userId
     * @return
     */
    User getUserById(String userId);    
  
    
  
    
    /**
     * 判断是否部署流程定义
     * @param name
     * @return
     */
   // Boolean isProcessDefinition(String name);
    
    
    
    /**
     * 判断流程定义是否部署
     * @param key
     * @return
     */
    boolean newCheckDeployByProcessDefinitionKey(String key);
	public ProcessEngine getProcessEngine() ;
    /**通过流程实例来查找所有发生过的审批任务
     * @param pInstId
     * @return
     */
    List<HistoricTaskInstance> findPorcessedTasks(String pInstId);
    
    /**得到用户发起的所有任务
     * @param user
     * @param key 查询关键字
     * @return
     */
    List<MyTask> getStartedTasks(User user,String key);
    
    /**得到用户历史审批任务
     * @param userId
     *  @param key 查询关键字
     * @return
     */
    List<MyTask> getHistoryTasksByUser(String userId,String key);
    
    /*
     * 获得审批任务的title，根据entityId和processDefinitionName
     */
    String getTaskTitle(String entityId,String processDefinitionName);
}


